package com.itheima.api.generic.demo06;

import java.util.ArrayList;
import java.util.List;

/**
 * 需求：假设现在需要定义一个方法，该方法上需要去定义一个集合类型的形式参数，集合类型的这个形参中的元素类型是不确定的，那应该怎么定义呢？
 * 按照我们的想法，既然这个集合类型的形式参数中的元素类型是不确定的，那么我们在定义这个集合类型的参数的时候不需要去明确类型
 */
public class GenericDemo01 {

    public static void main(String[] args) {


        // 使用多态的形式去创建对象
        List<String> list = new ArrayList<String>() ;
        list.add("hello") ;
        list.add("world");
        list.add("java") ;

        // 去调用show方法
        // show(list);         // 不允许把不同元素类型的集合变量进行赋值, 为什么呢？提高安全性

        // java在早期设计数组的时候，它是允许把不同数据类型的数组进行赋值
//        Integer[] integers = new Integer[5];
//        Number[] numbers = integers ;
//        numbers[0] = 0.5 ;                      // ArrayStoreException

        /**
         * 这个错误是发生在运行时期，给我们程序带来很大的安全隐患； 数组的早期这种设计应该java的一种缺陷
         * 后期在进行集合设计的时候就考虑到了这一点，对集合进行了优化;不允许把不同元素类型的集合变量进行赋值, 为什么呢？提高安全性
         */

//        System.out.println(numbers[0]);


    }

    /**
     * 我们这个List是一个泛型接口，在使用的时候就需要去明确这个泛型类型；如果我们没有明确这个类型，那么编译期就会产生警告
     * 告诉你现在这个接口是一个泛型接口，您在使用的时候需要给我明确这个类型，如果没有明确类型，那么后期有可能会出现问题
     *
     * 那么怎么解决？ 很显然，我们只需要去指定一个类型，指定那一个类型呢？我们的需求是不明确数据类型，言下之意就会在使用这个方法的时候，所传递的
     * 集合类型的参数可以使用任意类型，那么谁可以去接收任意类型的数据呢? Object
     * @param list
     */
//    public static void show(List list) {
//        list.forEach( s -> {
//            System.out.println(s);
//        });
//    }

    public static void show(List<Object>  obj) {
        obj.forEach( s -> {
            System.out.println(s);
        });
    }

}
